package com.kl.model;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * @author superlkl
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "t_user") //指定实体类对应的数据库表，如果不说明，查找的表面就默认为类名小写
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键ID
     * 如果不设置类型值，默认则使用IdType.ASSIGN_ID策略（自3.3.0起）,
     * 该策略会使用雪花算法自动生成主键ID，主键类型为长或字符串（分别对应的MySQL的表字段为BIGINT和VARCHAR）
     * <p>
     * 如果使用IdType.ASSIGN_UUID策略，并重新自动生成排除中划线的UUID作为主键,
     * 主键类型为String，对应MySQL的表分段为VARCHAR（32）
     * <p>
     * 对于像MySQL这样的支持主键自动递增的数据库，我们可以使用IdType.AUTO策略
     * 注意：这种自增的方式必须要求数据库表的id也要设置为主键且自动递增
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 邮箱
     */
    private String email;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 最后修改时间
     * FieldFill.UPDATE:在进行插入或更新时进行自动填充
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 逻辑删除（0 未删除、1 删除）
     * 注：逻辑删除实际执行的是更新语句，如 UPDATE user SET delete_flag=1 WHERE id=? AND delete_flag=0
     * 如果逻辑删除字段默认为null，那么就需要在保存数据时将该字段赋值，否则删除不了
     * 如果逻辑删除字段默认值就是0，与下面规定的对应，那么在保存数据时就不用填充该字段了，也可以删除成功
     */
    @TableLogic(value = "0", delval = "1")
    @TableField(fill = FieldFill.INSERT)
    private Integer deleteFlag;

    /**
     * 标准为乐观锁：通过版本号实现（默认为 1），需要添加乐观锁插件才能使用
     */
    @Version
    @TableField(fill = FieldFill.INSERT)
    private Integer version;

}
